<%@ include file="/common/taglibs.jsp"%>

<menu:useMenuDisplayer name="Velocity" config="navbarMenu.vm" permissions="rolesAdapter">
<div class="nav-collapse collapse">
<%-- EL表达式，最终通过HttpServletRequest（注意不是servletRequest）接口获取remoteUser （最后被封装成 SecurityContextHolderAwareRequestWrapper）--%>

<%-- 对于servletRequest的封装，是 spring 通过 SecurityContextHolderAwareRequestFilter过滤器 进行封装

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
            throws IOException, ServletException {  
        chain.doFilter(new SecurityContextHolderAwareRequestWrapper((HttpServletRequest) req, rolePrefix), res);  
    }  

SecurityContextHolderAwareRequestWrapper类对request包装的目的主要是实现servlet api(HttpServletRequest)的一些接口方法isUserInRole、getRemoteUser 
(HttpServletRequest包括getCookies getHeaders等方法)

这个过滤器目的仅仅是实现java ee中servlet api一些接口方法。 
一些应用中直接使用getRemoteUser方法、isUserInRole方法，在使用spring security时其实就是通过这个过滤器来实现的。

public String getRemoteUser() {  
    Authentication auth = getAuthentication();  
  
    if ((auth == null) || (auth.getPrincipal() == null)) {  
        return null;  
    }  
  
    if (auth.getPrincipal() instanceof UserDetails) {  
        return ((UserDetails) auth.getPrincipal()).getUsername();  
    }  
  
    return auth.getPrincipal().toString();  
}  

@Override  
public boolean isUserInRole(String role) {  
    return isGranted(role);  
}  

--%>
<ul class="nav">
    <c:if test="${empty pageContext.request.remoteUser}">
        <li class="active">
            <a href="<c:url value="/login"/>"><fmt:message key="login.title"/></a>
        </li>
    </c:if>
    <%-- request.isUserInRole来判断是否显示菜 单 同样由上述的 SecurityContextHolderAwareRequestFilter 封装 --%>
    <menu:displayMenu name="MainMenu"/>
    <menu:displayMenu name="UserMenu"/>
    <menu:displayMenu name="AdminMenu"/>
    <menu:displayMenu name="Logout"/>
</ul>
</div>
</menu:useMenuDisplayer>
